﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Text.RegularExpressions;
using Data_Access_Layer;
using Business_Layer;
using log4net;
using log4net.Config;
using System.Globalization;

namespace CaffeBillard
{
    public partial class FormArticle : DevComponents.DotNetBar.Office2007Form
    {
        protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public FormArticle()
        {
            InitializeComponent();
            dgvArt.AutoGenerateColumns = false;
            this.BackColor = Color.FromArgb(194, 217, 247);
        }

        #region Khai báo
        /// <summary>
        /// Kiểm tra xem đã thêm, cập nhật xong chưa
        /// </summary>
        private bool _curr = false;

        /// <summary>
        /// Khai báo cho ArticleController
        /// </summary>
        private ArticleController _manager;

        /// <summary>
        /// _selectall = true khi tất cả các dòng trong datagridview được check
        /// </summary>
        private bool _selectall = false;

        /// <summary>
        /// Khai báo in 
        /// </summary>
        private Utility _com;

        /// <summary>
        /// Tên nhân viên đăng nhập hiện tại
        /// </summary>
        private string name;
        /// <summary>
        /// Khai báo thuộc tính supplier để sử dụng các phương thức của nó
        /// </summary>
        private SuppilerController suppiler;
        #endregion

        #region Sự kiện form
        /// <summary>
        /// Hàm xử lý lấy danh sách hàng hóa
        /// </summary>
        private void LoadArt()
        {
            dgvArt.DataSource = new BindingSource { DataSource = _manager.GetAll() };
        }

        /// <summary>
        /// Load form
        /// </summary>
        private void FormArticle_Load(object sender, EventArgs e)
        {
            name = Employee.Objects.FirstOrDefault(x => x.Id == WorkSession.Current.CurrentAccount.EmpId).Name.ToString();
            _com = new Utility();
            _manager = new ArticleController();
            suppiler= new SuppilerController();
            LoadArt();
            LoadSup();
            cbbSup.DataSource = suppiler.GetAll();
            cbbSup.DisplayMember = "SupName";
            cbbSup.ValueMember = "Id";
        }

        /// <summary>
        /// Lúc nhấn phím enter hoặc chuyển qua dòng mới thì thêm mới hoặc update
        /// </summary>
        private void dgvArt_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            if(_curr)
            {
                try
                {
                    XmlConfigurator.Configure();
                    log.Info(name + ": Them hang hoa");
                    //Lấy dòng hiện tại của Datagridview
                    var _cur = dgvArt.Rows[e.RowIndex];

                    //Khai báo đối tượng Article 
                    Article art = new Article();

                    //Gán thuộc tính tương ứng giá trị trên datagridview
                    art.Id = Convert.ToInt32(_cur.Cells[1].Value.ToString());
                    art.ArtName = _cur.Cells[2].Value.ToString();
                    art.Price = Convert.ToInt32(_cur.Cells[3].Value.ToString());
                    art.Unit = _cur.Cells[4].Value.ToString();
                    art.Quantity = Convert.ToInt32(_cur.Cells[5].Value.ToString());
                    art.SupId = Convert.ToInt32(_cur.Cells[6].Value.ToString());
                    art.Deleted = false;

                    //Thêm hoặc cập nhật
                    if (_manager.InsertOrUpdate(art))
                    {
                        MessageBox.Show("Cập nhật thành công","Thông báo", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                        LoadArt();
                    }
                    else
                    {
                        MessageBox.Show("Cập nhật thất bại", "Thông báo", MessageBoxButtons.OK,
                                    MessageBoxIcon.Warning);
                    }
                    //Nếu xảy ra lỗi thì thông báo lỗi
                    if (_manager._err != "")
                        MessageBox.Show(_manager._err, "Thông báo", MessageBoxButtons.OK,
                                    MessageBoxIcon.Warning);
                    

                }
                catch (Exception ex)
                {
                    MessageBox.Show("Lỗi hệ thống \n" + ex.Message, "Thông báo", MessageBoxButtons.OK,
                                    MessageBoxIcon.Warning);
                }
            }
            //Gán lại giá trị cho _curr
            _curr = false;
        }

        /// <summary>
        /// Kiểm tra dữ liệu nhập vào
        /// </summary>
        private void dgvArt_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {
                if (dgvArt.IsCurrentRowDirty && e.ColumnIndex > 0)
                {
                    var _current = dgvArt.Rows[e.RowIndex];
                    if (_current.Cells[2].Value == null || _current.Cells[4].Value == null)
                    {
                        MessageBox.Show("Không được để trống dữ liệu!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }
                    if (!Number(_current.Cells[3].Value.ToString()))
                    {
                        MessageBox.Show("Giá không phải là giá trị số", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }
                    if (!Number(_current.Cells[5].Value.ToString()))
                    {
                        MessageBox.Show("Số lượng không phải là giá trị số", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show("Lỗi hệ thống \n" + ex.Message, "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
            }
            _curr = dgvArt.IsCurrentRowDirty;
        }

        /// <summary>
        /// Xử lý sự kiện khi bấm chọn dòng
        /// </summary>
        private void dgvSup_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1)
            {
                if (e.ColumnIndex == 0)
                {
                    if (_selectall)
                    {
                        for (int i = 0; i < dgvArt.Rows.Count; i++)
                        {
                            dgvArt.Rows[i].Cells[0].Value = false;
                            _selectall = false;
                        }
                    }
                    else
                    {
                        for (int i = 0; i < dgvArt.Rows.Count; i++)
                        {
                            dgvArt.Rows[i].Cells[0].Value = true;
                            _selectall = true;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// Tìm kiếm theo các kiểu đã chọn 
        /// </summary>
        private void txtFind_TextChanged(object sender, EventArgs e)
        {
            if (txtFind.Text == "")
                dgvArt.DataSource = new BindingSource { DataSource = _manager.GetAll() };
            switch (cbbFindType.Text)
            {
                case "Tìm theo mã":
                    int n = 0;
                    if (!int.TryParse(txtFind.Text, out n))
                        txtFind.Text = "";
                    else
                        dgvArt.DataSource = new BindingSource { DataSource = _manager.FindById(int.Parse(txtFind.Text)) };
                    break;
                case "Tìm theo tên":
                    dgvArt.DataSource = new BindingSource { DataSource = _manager.FindByName(txtFind.Text) };
                    break;
                default:
                    dgvArt.DataSource = new BindingSource { DataSource = _manager.FindByName(txtFind.Text) };
                    break;
            }
        }

        /// <summary>
        /// Xử lý xóa hàng hóa được chọn
        /// </summary>
        private void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                var artcurr= WorkSession.Current.CurrentArticle;
                //Lấy những dòng được chọn
                var selectedRows = dgvArt.Rows.Cast<DataGridViewRow>()
                        .Where(x => x.Cells[0].Value != null && x.Cells[1].Value != null && x.Cells[1].Value.ToString() != "0" && (bool)x.Cells[0].Value)
                        .ToList();
                //Nếu không có dòng nào được chọn thì thông báo cho người dùng chọn lại
                if (selectedRows.Count == 0)
                {
                    MessageBox.Show("Bạn chưa chọn hàng hóa nào để xóa", "Thông báo",
                                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                //Yêu cầu người dùng xác nhận việc xóa
                if (MessageBox.Show("Tất cả các hàng hóa sẽ được xóa bỏ, bạn có chắc muốn xóa không?", "Cảnh báo !!!", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    XmlConfigurator.Configure();
                    log.Info(name + ": Xoa hang hoa");
                    //Duyệt qua từng dòng được chọn
                    for (int i = selectedRows.Count - 1; i >= 0; i--)
                    {
                        // Lấy ra hàng hóa được chọn
                        var art = selectedRows[i].DataBoundItem as Article;
                        art.Id = int.Parse(selectedRows[i].Cells[1].Value.ToString());
                        bool kt = false;
                        for (int j = 0; j < artcurr.Count; j++)
                        {
                            if(artcurr[i].Id==art.Id)
                            {
                                kt = true;
                                break;
                            }
                            else
                            {
                                kt = false;
                            }
                        }
                        if (kt)
                            MessageBox.Show("Hàng hóa mà bạn định xóa hiện đang được sử dụng, không xóa được");
                        else
                        {
                            art.Deleted = true;
                            _manager.Delete(art);
                        }
                       
                    }
                    LoadArt();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :" + ex.Message);
            }
          
            
        }

        /// <summary>
        /// In danh sách hàng hóa
        /// </summary>
        private void btnPrint_Click(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + ": Xuat danh sach hang hoa");
            CustomEx ex = new CustomEx();
            ex.Show();
            ex.FormClosed += ex_FormClosed;
        }

        /// <summary>
        /// Xử lý khi đóng form in thì xuất ra định dạng PDF hoặc Excel
        /// </summary>
        private void ex_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (CustomEx.Hz.type == 2)
                ExportToPDF();
            else if (CustomEx.Hz.type == 1)
                ExportToEx();
        }

        /// <summary>
        /// Xuất file Excel
        /// </summary>
        private void ExportToEx()
        {
            saveFileDialog1.Filter = "(*.xls;*.xlsx)|*.xls;*.xlsx";
            saveFileDialog1.FileName = "*.xlsx";
            if (dgvArt.Rows.Count - 1 == 0)
                MessageBox.Show("Không có dữ liệu để xuất");
            else
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    _com.ExportToExcel(dgvArt, saveFileDialog1.FileName);
                }
        }
        
        /// <summary>
        /// Xuất file PDF
        /// </summary>
        private void ExportToPDF()
        {
            saveFileDialog1.Filter = "(*.PDF)|*.PDF";
            saveFileDialog1.FileName = "*.PDF";
            if (dgvArt.Rows.Count - 1 == 0)
                MessageBox.Show("Không có dữ liệu để xuất");
            else
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    _com.ExportToPDF(dgvArt, saveFileDialog1.FileName);
                }
        }
        #endregion

        #region Hàm bổ trợ
        public bool Number(string s)
        {
            int a = 0;
            if (int.TryParse(s,NumberStyles.Any,NumberFormatInfo.InvariantInfo,out a))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Load nhà cung cấp vào Combobox
        /// </summary>
        private void LoadSup()
        {
            SupId.DataSource = suppiler.GetAll();
            SupId.ValueMember = "Id";
            SupId.DisplayMember = "SupName";
        }
        #endregion

        private void cbbFindType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(cbbFindType.Text=="Tất cả")
            {
                dgvArt.DataSource = new BindingSource { DataSource = _manager.GetAll() };
            }
            if(cbbFindType.Text=="Tìm theo mã" || cbbFindType.Text=="Tìm theo tên")
            {
                txtFind.Enabled = true;
                cbbSup.Enabled = false;
            }
            else
            {
                txtFind.Enabled = false;
                cbbSup.Enabled = true;
            }
        }
        /// <summary>
        /// Tìm theo nhà cung cấp
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbbSup_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                int n = 0;
                if (int.TryParse(cbbSup.SelectedValue.ToString(),out n))
                     dgvArt.DataSource = new BindingSource
                                        {DataSource = _manager.FindBySupplier(int.Parse(cbbSup.SelectedValue.ToString()))};
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi " + ex.Message);
            }
        }
    }
}
